// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: braces fieldsfirst space lnc package com.google.zxing.aztec.detector; import com.google.zxing.NotFoundException; import com.google.zxing.ResultPoint; import com.google.zxing.aztec.AztecDetectorResult; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.GridSampler; import com.google.zxing.common.detector.WhiteRectangleDetector; import com.google.zxing.common.reedsolomon.GenericGF; import com.google.zxing.common.reedsolomon.ReedSolomonDecoder; import com.google.zxing.common.reedsolomon.ReedSolomonException; // Referenced classes of package com.google.zxing.aztec.detector: // b public final class Detector { private final BitMatrix a; private boolean b; private int c; private int d; private int e; private int f; public Detector(BitMatrix bitmatrix) { a = bitmatrix; } private static int a(float f1) { return (int)(0.5F + f1); } private int a(b b1, b b2) { float f1 = b(b1, b2); float f2 = (float)(b2.a - b1.a) / f1; float f3 = (float)(b2.b - b1.b) / f1; float f4 = b1.a; float f5 = b1.b; boolean flag = a.get(b1.a, b1.b); int i = 0; float f6 = f4; float f7 = f5; for (int j = 0; (float)j < f1; j++) { f6 += f2; f7 += f3; if (a.get(a(f6), a(f7)) != flag) { i++; } } float f8 = (float)i / f1; if ((double)f8 > 0.10000000000000001D && (double)f8 < 0.90000000000000002D) { return 0; } if ((double)f8 <= 0.10000000000000001D) { return !flag ? -1 : 1; } return !flag ? 1 : -1; } private b a() { ResultPoint resultpoint; ResultPoint resultpoint1; ResultPoint resultpoint2; ResultPoint resultpoint3; int k; int l; ResultPoint resultpoint4; ResultPoint resultpoint5; ResultPoint resultpoint6; ResultPoint resultpoint7; try { ResultPoint aresultpoint1[] = (new WhiteRectangleDetector(a)).detect(); resultpoint = aresultpoint1[0]; resultpoint1 = aresultpoint1[1]; resultpoint2 = aresultpoint1[2]; resultpoint3 = aresultpoint1[3]; } catch (NotFoundException notfoundexception) { int i = a.getWidth() / 2; int j = a.getHeight() / 2; resultpoint = a(new b(i + 7, j - 7, null), false, 1, -1).a(); resultpoint1 = a(new b(i + 7, j + 7, null), false, 1, 1).a(); resultpoint2 = a(new b(i - 7, j + 7, null), false, -1, 1).a(); resultpoint3 = a(new b(i - 7, j - 7, null), false, -1, -1).a(); } k = a((resultpoint.getX() + resultpoint3.getX() + resultpoint1.getX() + resultpoint2.getX()) / 4F); l = a((resultpoint.getY() + resultpoint3.getY() + resultpoint1.getY() + resultpoint2.getY()) / 4F); try { ResultPoint aresultpoint[] = (new WhiteRectangleDetector(a, 15, k, l)).detect(); resultpoint4 = aresultpoint[0]; resultpoint5 = aresultpoint[1]; resultpoint6 = aresultpoint[2]; resultpoint7 = aresultpoint[3]; } catch (NotFoundException notfoundexception1) { resultpoint4 = a(new b(k + 7, l - 7, null), false, 1, -1).a(); resultpoint5 = a(new b(k + 7, l + 7, null), false, 1, 1).a(); resultpoint6 = a(new b(k - 7, l + 7, null), false, -1, 1).a(); resultpoint7 = a(new b(k - 7, l - 7, null), false, -1, -1).a(); } return new b(a((resultpoint4.getX() + resultpoint7.getX() + resultpoint5.getX() + resultpoint6.getX()) / 4F), a((resultpoint4.getY() + resultpoint7.getY() + resultpoint5.getY() + resultpoint6.getY()) / 4F), null); } private b a(b b1, boolean flag, int i, int j) { int k = i + b1.a; int l; for (l = j + b1.b; a(k, l) && a.get(k, l) == flag; l += j) { k += i; } int i1 = k - i; int j1 = l - j; int k1; for (k1 = i1; a(k1, j1) && a.get(k1, j1) == flag; k1 += i) { } int l1 = k1 - i; int i2; for (i2 = j1; a(l1, i2) && a.get(l1, i2) == flag; i2 += j) { } return new b(l1, i2 - j, null); } private BitMatrix a(BitMatrix bitmatrix, ResultPoint resultpoint, ResultPoint resultpoint1, ResultPoint resultpoint2, ResultPoint resultpoint3) { int i; GridSampler gridsampler; float f1; float f2; float f3; float f4; float f5; float f6; float f7; float f8; float f9; float f10; float f11; float f12; if (b) { i = 11 + 4 * c; } else if (c <= 4) { i = 15 + 4 * c; } else { i = 15 + (4 * c + 2 * (1 + (-4 + c) / 8)); } gridsampler = GridSampler.getInstance(); f1 = (float)i - 0.5F; f2 = (float)i - 0.5F; f3 = (float)i - 0.5F; f4 = (float)i - 0.5F; f5 = resultpoint.getX(); f6 = resultpoint.getY(); f7 = resultpoint3.getX(); f8 = resultpoint3.getY(); f9 = resultpoint2.getX(); f10 = resultpoint2.getY(); f11 = resultpoint1.getX(); f12 = resultpoint1.getY(); return gridsampler.sampleGrid(bitmatrix, i, i, 0.5F, 0.5F, f1, 0.5F, f2, f3, 0.5F, f4, f5, f6, f7, f8, f9, f10, f11, f12); } private void a(b ab[]) { int i = 0; boolean aflag[] = a(ab[0], ab[1], 1 + 2 * e); boolean aflag1[] = a(ab[1], ab[2], 1 + 2 * e); boolean aflag2[] = a(ab[2], ab[3], 1 + 2 * e); boolean aflag3[] = a(ab[3], ab[0], 1 + 2 * e); if (aflag[0] && aflag[2 * e]) { f = 0; } else if (aflag1[0] && aflag1[2 * e]) { f = 1; } else if (aflag2[0] && aflag2[2 * e]) { f = 2; } else if (aflag3[0] && aflag3[2 * e]) { f = 3; } else { throw NotFoundException.getNotFoundInstance(); } boolean aflag5[]; if (b) { boolean aflag6[] = new boolean[28]; for (int k = 0; k < 7; k++) { aflag6[k] = aflag[k + 2]; aflag6[k + 7] = aflag1[k + 2]; aflag6[k + 14] = aflag2[k + 2]; aflag6[k + 21] = aflag3[k + 2]; } aflag5 = new boolean[28]; for (; i < 28; i++) { aflag5[i] = aflag6[(i + 7 * f) % 28]; } } else { boolean aflag4[] = new boolean[40]; for (int j = 0; j < 11; j++) { if (j < 5) { aflag4[j] = aflag[j + 2]; aflag4[j + 10] = aflag1[j + 2]; aflag4[j + 20] = aflag2[j + 2]; aflag4[j + 30] = aflag3[j + 2]; } if (j > 5) { aflag4[j - 1] = aflag[j + 2]; aflag4[-1 + (j + 10)] = aflag1[j + 2]; aflag4[-1 + (j + 20)] = aflag2[j + 2]; aflag4[-1 + (j + 30)] = aflag3[j + 2]; } } aflag5 = new boolean[40]; for (; i < 40; i++) { aflag5[i] = aflag4[(i + 10 * f) % 40]; } } a(aflag5, b); a(aflag5); } private void a(boolean aflag[]) { byte byte0; byte byte1; int i; if (b) { byte0 = 2; byte1 = 6; } else { byte0 = 5; byte1 = 11; } for (i = 0; i < byte0; i++) { c = c << 1; if (aflag[i]) { c = 1 + c; } } for (int j = byte0; j < byte0 + byte1; j++) { d = d << 1; if (aflag[j]) { d = 1 + d; } } c = 1 + c; d = 1 + d; } private static void a(boolean aflag[], boolean flag) { byte byte0; byte byte1; int i; int ai[]; if (flag) { byte0 = 7; byte1 = 2; } else { byte0 = 10; byte1 = 4; } i = byte0 - byte1; ai = new int[byte0]; for (int j = 0; j < byte0; j++) { int k1 = 1; int l1 = 1; for (; k1 <= 4; k1++) { if (aflag[(4 + 4 * j) - k1]) { ai[j] = l1 + ai[j]; } l1 <<= 1; } } int k; try { (new ReedSolomonDecoder(GenericGF.AZTEC_PARAM)).decode(ai, i); } catch (ReedSolomonException reedsolomonexception) { throw NotFoundException.getNotFoundInstance(); } for (k = 0; k < byte1; k++) { int l = 1; int i1 = 1; while (l <= 4) { int j1 = (4 + k * 4) - l; boolean flag1; if ((i1 & ai[k]) == i1) { flag1 = true; } else { flag1 = false; } aflag[j1] = flag1; i1 <<= 1; l++; } } } private boolean a(int i, int j) { return i >= 0 && i < a.getWidth() && j > 0 && j < a.getHeight(); } private boolean a(b b1, b b2, b b3, b b4) { b b5 = new b(b1.a - 3, 3 + b1.b, null); b b6 = new b(b2.a - 3, b2.b - 3, null); b b7 = new b(3 + b3.a, b3.b - 3, null); b b8 = new b(3 + b4.a, 3 + b4.b, null); for (int i = a(b8, b5); i == 0 || a(b5, b6) != i || a(b6, b7) != i || a(b7, b8) != i;) { return false; } return true; } private b[] a(b b1) { boolean flag = true; e = 1; b b2 = b1; b b3 = b1; b b4 = b1; label0: do { b b5; b b6; b b7; b b8; label1: { if (e < 9) { b5 = a(b4, flag, 1, -1); b6 = a(b3, flag, 1, 1); b7 = a(b2, flag, -1, 1); b8 = a(b1, flag, -1, -1); if (e <= 2) { break label1; } float f2 = (b(b8, b5) * (float)e) / (b(b1, b4) * (float)(2 + e)); if ((double)f2 >= 0.75D && (double)f2 <= 1.25D && a(b5, b6, b7, b8)) { break label1; } } if (e != 5 && e != 7) { throw NotFoundException.getNotFoundInstance(); } break label0; } if (!flag) { flag = true; } else { flag = false; } e = 1 + e; b1 = b8; b2 = b7; b3 = b6; b4 = b5; } while (true); boolean flag1; float f1; int i; int j; int k; int l; int i1; int j1; int k1; int l1; int i2; int j2; int k2; int l2; if (e == 5) { flag1 = true; } else { flag1 = false; } b = flag1; f1 = 1.5F / (float)(-3 + 2 * e); i = b4.a - b2.a; j = b4.b - b2.b; k = a((float)b2.a - f1 * (float)i); l = a((float)b2.b - f1 * (float)j); i1 = a((float)b4.a + f1 * (float)i); j1 = a((float)b4.b + f1 * (float)j); k1 = b3.a - b1.a; l1 = b3.b - b1.b; i2 = a((float)b1.a - f1 * (float)k1); j2 = a((float)b1.b - f1 * (float)l1); k2 = a((float)b3.a + f1 * (float)k1); l2 = a((float)b3.b + f1 * (float)l1); if (!a(i1, j1) || !a(k2, l2) || !a(k, l) || !a(i2, j2)) { throw NotFoundException.getNotFoundInstance(); } else { return (new b[] { new b(i1, j1, null), new b(k2, l2, null), new b(k, l, null), new b(i2, j2, null) }); } } private boolean[] a(b b1, b b2, int i) { boolean aflag[] = new boolean[i]; float f1 = b(b1, b2); float f2 = f1 / (float)(i - 1); float f3 = (f2 * (float)(b2.a - b1.a)) / f1; float f4 = (f2 * (float)(b2.b - b1.b)) / f1; float f5 = b1.a; float f6 = b1.b; for (int j = 0; j < i; j++) { aflag[j] = a.get(a(f5), a(f6)); f5 += f3; f6 += f4; } return aflag; } private static float b(b b1, b b2) { return (float)Math.sqrt((b1.a - b2.a) * (b1.a - b2.a) + (b1.b - b2.b) * (b1.b - b2.b)); } private ResultPoint[] b(b ab[]) { byte byte0 = -1; int i = 2 * c; int j; float f1; int k; int l; int i1; int j1; int k1; int l1; int i2; int j2; int k2; int l2; int i3; int j3; int k3; int l3; int i4; int j4; int k4; int l4; int i5; if (c > 4) { j = 1; } else { j = 0; } f1 = (float)(j + i + (-4 + c) / 8) / (2.0F * (float)e); k = ab[0].a - ab[2].a; if (k > 0) { l = 1; } else { l = byte0; } i1 = k + l; j1 = ab[0].b - ab[2].b; if (j1 > 0) { k1 = 1; } else { k1 = byte0; } l1 = k1 + j1; i2 = a((float)ab[2].a - f1 * (float)i1); j2 = a((float)ab[2].b - f1 * (float)l1); k2 = a((float)ab[0].a + f1 * (float)i1); l2 = a((float)ab[0].b + f1 * (float)l1); i3 = ab[1].a - ab[3].a; if (i3 > 0) { j3 = 1; } else { j3 = byte0; } k3 = j3 + i3; l3 = ab[1].b - ab[3].b; if (l3 > 0) { byte0 = 1; } i4 = byte0 + l3; j4 = a((float)ab[3].a - f1 * (float)k3); k4 = a((float)ab[3].b - f1 * (float)i4); l4 = a((float)ab[1].a + f1 * (float)k3); i5 = a((float)ab[1].b + f1 * (float)i4); if (!a(k2, l2) || !a(l4, i5) || !a(i2, j2) || !a(j4, k4)) { throw NotFoundException.getNotFoundInstance(); } else { ResultPoint aresultpoint[] = new ResultPoint[4]; aresultpoint[0] = new ResultPoint(k2, l2); aresultpoint[1] = new ResultPoint(l4, i5); aresultpoint[2] = new ResultPoint(i2, j2); aresultpoint[3] = new ResultPoint(j4, k4); return aresultpoint; } } public AztecDetectorResult detect() { b ab[] = a(a()); a(ab); ResultPoint aresultpoint[] = b(ab); return new AztecDetectorResult(a(a, aresultpoint[f % 4], aresultpoint[(3 + f) % 4], aresultpoint[(2 + f) % 4], aresultpoint[(1 + f) % 4]), aresultpoint, b, d, c); } }